Godot: signal管理用のシングルトンクラス Events.gd を作成する
signal管理用のシングルトンクラス Events.gd を作成する 今までsignal管理は困っていた。同じようにシングルトンのglobalクラスでやっていたが、他の処理も色々含めてしまっていた。専用のEvents クラスを作るのは参考になったkidooom.icon
code:Event.gd
extends Node
signal player_died
このクラスにはひたすら signal定義を並べる
これによって、signal が各クラスにバラけないようにして、どんな signal がゲーム内に存在するか把握しやすくなる
んで、connectする方法は今までと同じで、Worldやmainスクリプトなどの依存関係の親
code:World.gd
const PlayerScene = preload("res:///Player.tscn")
func _ready():
Events.connect("player_died", self, "_on_player_died")
func _on_player_died():
var player = PlayerScene.instace()
add_child(player)
player.connect_camera(camera)
Playerのような、よく読み込み PackecScene は const で preload しておいたら、instace()しやすい
経験値バーの値を signal を使って組み立てるとする
Events.gd で signal 定義
code:Event.gd
extends Node
signal exp_changed(exp_rate: float)
main.gd などで connect する側
code:connect
func _ready() -> void:
Events.exp_changed.connect(expBar._on_exp_changed)
emit する側
code:gd
func _on_kill_enemy(exp: int) -> void:
current_exp += exp
var exp_rate = current_exp # TODO: 次のレベルまでに必要な経験値割合とする
Events.exp_changed.emit(exp_rate)
(受信する側)
code:gd
func _on_exp_changed(exp_rate: float) -> void:
value = exp_rate
こちらの記事でいうところの、Event buses に相当する